package com.example.demo_flow

import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.debounce
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.fold
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.reduce
import kotlinx.coroutines.flow.sample
import kotlinx.coroutines.runBlocking

/**
 * @author yaotianxue
 * @description
 *
map: 将一个流中的元素转换成另一个流
filter:过滤
onEach：遍历
collect：收集最终的结果哦
debounce:数据之间时间间隔超过指定时间发送成功
sample:按照指定的时间采集数据
reduce:Flow的累积值和low的当前值做运算，得到结果
fold：和reduce一样，可以设置初始值
 */

fun main() {
    //协程作用域
//    runBlocking {
//        var flow = flowOf(1,2,3,4,5)
//        flow.onEach {
//            println("前：$it")
//        }.map {
//            it * it
//        }.onEach {
//            println("map：$it")
//        }.filter {
//            it > 10
//        }.collect{
//            println(it)
//        }
//    }
//    runBlocking {
//        flow {
//            emit("n")
//            emit("b")
//            delay(600)
//            emit("a")
//            delay(100)
//            emit("m")
//        }.debounce(500)
//            .collect{ println(it) }
//    }
//    runBlocking {
//        flow {
//            var num = 0
//            while (true) {
//                emit("发送一条弹幕 $num")
//                num++
//            }
//        }
//            .sample(1000)
//            .flowOn(Dispatchers.IO)
//            .collect {
//                println(it)
//            }
//    }
    runBlocking {
        var flow = flowOf(1,2,3,4,5,6)
        var result = flow.reduce{acc,value-> acc * value}
        println(result)
    }
    runBlocking {
        var flow = flowOf(1,2,3,4,5,6)
        var result = flow.fold(0){acc,value-> acc * value}
        println(result)
    }
}